from typing import Optional, List, Any

from pydantic.main import BaseModel


class StrategyParam(BaseModel):
    variable: Optional[str]
    value: Optional[float]
    maxValue: Optional[float]
    minValue: Optional[float]

    def getFormatedExpr(self):
        return '%s = %s;' % (self.variable, self.value)


class ChartLayerQuery(BaseModel):
    layerId: str
    strategyId: int
    strategyParams: List[StrategyParam]



# 图表查询参数
class ChartQuery(BaseModel):
    chartId: Optional[str]
    instrumentId: Optional[int]
    adjust: Optional[str]
    frequency: Optional[str]
    start: Optional[str]
    end: Optional[str]
    layerQuerys: List[ChartLayerQuery]


# 图表查询结果集
# 图表对象，一个图表有多个图层（对应一个策略，或者一个手绘），一个图层有多条绘线（Series）
# 图案
class ChartDrawing(BaseModel):
    drawingId: str
    # 绘线名，即变量名
    name: str
    # 图案类型
    type: str
    # 图案数据
    data: Any
    # icon或者text展示的位置
    position: Optional[Any]
    # symbol
    symbol: Optional[Any]
    # 样式
    style: Optional[Any]

class LayerPrecision(BaseModel):
    price: int
    volume: int

# 图层
class ChartLayer(BaseModel):
    # 图层id
    layerId: str
    # 策略id
    strategyId: int
    # 图层名称（策略名称）
    name: str
    # 绘图方式,主图，主图叠加，副图
    drawType: str
    precision: LayerPrecision
    # 策略参数
    strategyParams: List[StrategyParam]
    drawings: List[ChartDrawing]


# 图表对象
class Chart(BaseModel):
    # 图表id
    chartId: str
    layers: List[ChartLayer]
